//user的schema
var mongoose = require('mongoose')

//加密算法库
var bcrypt = require('bcryptjs')
//不加盐值的加密库
var crypto = require('crypto')
//盐值复杂度
const SALT_WORK_FACTOR=10;

var UserSchema = new mongoose.Schema({

	username:String,
	password:String,
	email:{
		//设置email为唯一约束
		unique:true,
		type:String
	},
	head:String,

	meta:{
		createAt:{
			type:Date,
			default:Date.now()
		},

		updateAt:{
			type:Date,
			default:Date.now()
		}
	}



})

//这里为entity实例save方法进行前调用的pre方法
UserSchema.pre('save',function(next){

	var user = this
	if(this.isNew){

		this.meta.createAt = this.meta.updateAt =Date.now()

		//生成随机盐，第一个参数为计算强度，默认为10，第二个为回调函数，获取盐值
		
		bcrypt.genSalt(SALT_WORK_FACTOR,function(err,salt){

			if(err){
				return next(err)
			}
			bcrypt.hash(user.password,salt,function(err,hash){

				if(err){
					return next(err)
				}
				user.password = hash

				var md5 = crypto.createHash('md5')

				var email_MD5 = md5.update(user.email.toLowerCase()).digest('hex')

				user.head = "http://www.gravatar.com/avatar/" + email_MD5

				next()
			})
			
		})
	}else{

		this.meta.updateAt =Date.now()
		next()

	}

})

UserSchema.methods = {

	comparePassword:function(_password,cb){

		bcrypt.compare(_password,this.password,function(err,isMatch){

			if(err){
				return cb(err)
			}

			cb(null,isMatch)
		})


	}
}

UserSchema.statics = {

	fetch:function(cb){

		return this.find({}).sort('meta.updateAt').exec(cb)
	},

	findById:function(id,cb){

		return this.findOne({_id:id}).exec(cb)
	},

	findByEmail:function(_email,cb){

		return this.findOne({email:_email}).exec(cb)
	}
}

module.exports = UserSchema